import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'
// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 50000 // request timeout
})

const time = 24 * 60 * 60 * 1000 // token过期时间 -- 1天
// 请求拦截器
service.interceptors.request.use((config) => {
  // console.log(15, config);
  // 新建角色 当config里面的地址路径为/auth/local/register"时,不加token'
  if (store.getters.token && !config.url.includes('/auth/local/register')) {
    config.headers.Authorization = 'Bearer ' + store.getters.token
    // 获取当前时间戳，判断token是否过期
    const curTime = Date.now() // 获取当前时间戳
    const loginTime = localStorage.getItem('loginTime')
    if (curTime - loginTime > time) {
      // 当两者时间大于规定的过期时间的时候，表示token已经过期
      // 退出登录
      store.dispatch('user/logout')
      // 跳转到登录页面
      router.push('/login')
      // 阻止请求，返回错误信息
      // 因为这里return的错误，将会被响应拦截器的第二个回调函数捕获到
      // 因此错误提示可以统一设置到响应拦截器中，又因为响应拦截器中，
      // 是通过err.massage来获取错误信息的，因此传递给响应拦截器的内容必须是一个错误对象
      // 因此可以用到new.Error构造函数，来生成错误对象
      // Message.error('登录超时!')
      return Promise.reject(new Error('登录超时!--- 前端设置'))
    }
  }
  return config // 放行请求
})

// 响应拦截器
service.interceptors.response.use(
  (res) => {
    // console.log('网络层面成功', res)
    const result = res.data
    if (result || Array.isArray(result) || result === 0) {
      // 数据层面成功
      return result
    } else {
      // 数据层面的失败
      Message.error('请求失败')
      return Promise.reject(new Error('请求失败'))
    }
    // 注意：这里一定要返回res，因为这里的res就是后端返回给我们的数据
    // 也就是将来调用接口时接收的数据，因此必须要返回接口，调用接口才能获取到
    // return res
  },
  (err) => {
    console.log('网络层面的错误', err)
    console.dir(56, err)
    // 后端设置token过期，都会在这里拦截到，并且会返回一个状态码值为10002来表示token过期
    if (err.response && err.response.data && err.response.data.code === 10002) {
      // 退出登录
      store.dispatch('user/logout')
      // 跳转到登陆页面
      router.push('/login')
      // 登录过期提示
      Message.error('登录超时！！！--- 后端设置')
    } else {
      // 错误提示
      Message.error(err.message)
    }
    // 把错误信息返回给接口，接口接受到错误信息后就不会继续执行await后面的代码了
    return Promise.reject(new Error(err.message))
  }
)

export default service
